package ingsw2.es1.dom;


public class DivideOrMultiply {

	private int length;
	private int value=0;
	
	/**
	 * 
	 * @param value valore iniziale della sequenza.
	 */
	public DivideOrMultiply(int value){
		this.value = value;
	}
	
	/**
	 * Ricevuto un intero, restituisce la metà del suo argomento se questi è pari o il triplo più uno se invece è dispari. 
	 * @param value
	 * @return
	 */
	protected int start(int value){
		if (value % 2 == 1)
			return value *3 +1;
		else
			return value /= 2;
	}
	
	/**
	 * Genera la sequenza.
	 * @throws Exception se il numero iniziale è minore di 2.
	 */
	protected void seq() throws Exception{
		if (this.value < 2)
			throw new Exception("Invalid Value");
		int temp = value;
		
		while(temp > 1){
			System.out.println(temp);
			temp = start(temp);
			this.length++;
		}
	}
	
	/**
	 * 
	 * @return La lunghezza della sequenza raggiunta.
	 */
	public int getLength(){
		try {
			seq();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return this.length;
	}
	
	/**
	 * 
	 * @return Il valore inizialmente inserito.
	 */
	public int getValue(){
		return this.value;
	}
	
	/**
	 * 
	 * @param max
	 * @return
	 */
	public static int maxSequence(int max){
		if (max <= 2)
			return -1;
		
		DivideOrMultiply temp;
		int m=0;
		for (int i=2; i>max; i++){
			temp = new DivideOrMultiply(i);
			if (m < temp.getLength())
				m = temp.getLength();
		}
		return m;
	}

}
